// 导入Vue的响应式API
import { ref, computed } from "vue";
// 导入Pinia的存储定义函数
import { defineStore } from "pinia";

// 定义本地存储中用户信息和令牌的键名
const USER_KEY = "USER_KEY";
const TOKEN_KEY = "TOKEN_KEY";

// 定义并导出身份认证存储
export const useAuthStore = defineStore("auth", () => {
  // 使用ref创建响应式的用户信息对象和令牌字符串
  let _user = ref({}); // 存储用户信息的响应式对象
  let _token = ref(""); // 存储身份令牌的响应式字符串

  // 设置用户信息和令牌的函数
  function setUserToken(user, token) {
    _user.value = user; // 更新用户信息
    _token.value = token; // 更新令牌
    // 将信息保存到本地存储
    localStorage.setItem(USER_KEY, JSON.stringify(user));
    localStorage.setItem(TOKEN_KEY, token);
  }

  // 清除用户信息和令牌的函数
  function clearUserToken(){
    _user.value = {} // 清空用户信息
    _token.value = "" // 清空令牌
    // 从本地存储中移除数据
    localStorage.removeItem(USER_KEY)
    localStorage.removeItem(TOKEN_KEY)
  }

  // 计算属性：获取用户信息
  let user = computed(() => {
    // 如果用户信息为空，尝试从本地存储获取
    if (Object.keys(_user.value).length === 0) {
      let user_str = localStorage.getItem(USER_KEY);
      if (user_str) {
        _user.value = JSON.parse(user_str);
      }
    }
    return _user.value;
  });

  // 计算属性：获取令牌
  let token = computed(() => {
    // 如果令牌为空，尝试从本地存储获取
    if (!_token.value) {
      let token_str = localStorage.getItem(TOKEN_KEY);
      if (token_str) {
        _token.value = token_str;
      }
    }
    return _token.value;
  });

  // 计算属性：判断是否已登录
  let is_login = computed(() => {
    // 当用户信息和令牌都存在时，认为用户已登录
    if (Object.keys(user.value).length > 0 && token.value) {
      return true;
    }
    return false;
  });

  // 返回存储的公共接口
  return { setUserToken, user, token, is_login, clearUserToken };
});
